package com.yaowk.system.controller;

import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.ext.interceptor.POST;
import com.jfinal.kit.JMap;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.tx.Tx;
import com.jfinal.plugin.activerecord.tx.TxConfig;
import com.yaowk.common.kit.Constant;
import com.yaowk.common.kit.I18nKit;
import com.yaowk.common.kit.ResultKit;
import com.yaowk.common.validator.RequiredIdValidator;
import com.yaowk.system.model.Module;
import com.yaowk.system.model.ModulePlatform;
import com.yaowk.system.model.Platform;
import com.yaowk.system.validator.EditModuleValidator;
import org.apache.shiro.authz.annotation.RequiresPermissions;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 系统配置-模块管理
 *
 * @authc yaowk
 * 2017/4/19
 */
@TxConfig(Constant.SYSTEM_MODULE)
public class ModuleController extends Controller {


    /**
     * 通过平台id查询模块列表
     *
     * @param id|平台id|Integer|必填
     * @title 查询模块列表
     */
    @Before(RequiredIdValidator.class)
    @RequiresPermissions("system:read")
    public void list() {
        renderJson(ResultKit.success(Module.dao.findByPlatformId(getParaToInt("id"))));
    }


    /**
     * 通过模块id查询模块信息
     *
     * @param id|模块id|Integer|必填
     * @title 查询模块信息
     */
    @Before(RequiredIdValidator.class)
    @RequiresPermissions("system:read")
    public void info() {
        Module module = Module.dao.findById(getParaToInt("id"));
        List<Platform> checkedPlatform = Platform.dao.findByModuleId(module.getId());
        List<Platform> platformList = Platform.dao.findPlatform();
        Map<Integer, Boolean> checkedMap = new HashMap<>();
        for (Platform platform : checkedPlatform) {
            checkedMap.put(platform.getId(), true);
        }
        List<Map<String, Object>> checkPlatformList = new ArrayList<>();
        for (Platform platform : platformList) {
            JMap map = JMap.create().set("id", platform.getId())
                    .set("name", platform.getName());
            if (checkedMap.get(platform.getId()) != null) {
                map.set("checked", true);
            }
            else {
                map.set("checked", false);
            }
            checkPlatformList.add(map);
        }

        JMap result = JMap.create().set("module", module).set("platforms", checkPlatformList);
        renderJson(ResultKit.success(result));
    }

    /**
     * 编辑平台模块信息
     *
     * @param id|模块id|Integer|必填
     * @param icon|图标|File|否
     * @param platform_id|互动平台id|Integer[]|否
     * @param name|模块名称|String|否
     * @param sort|排序，数字越大越靠前|Integer|否
     * @title 模块编辑
     */
    @Before({ POST.class, EditModuleValidator.class, Tx.class })
    @RequiresPermissions("system:update")
    public void edit() {
        String icon = getPara("icon");
        Object[] platformIds = getParaValuesToInt("platform_id");
        Integer id = getParaToInt("id");
        // 更新平台模块信息
        Module module = Module.dao.findById(id);
        if (StrKit.notNull(module)) {
            module.setName(getPara("name"));
            module.setIcon(icon);
            module.setSort(getParaToInt("sort"));
            module.update();
            // 删除互动平台并添加新的
            ModulePlatform.dao.deleteByModuleId(id);
            List<ModulePlatform> modulePlatformList = new ArrayList<ModulePlatform>();
            if (StrKit.notNull(platformIds)) {
                for (Object platformId : platformIds) {
                    modulePlatformList.add(new ModulePlatform().setModuleId(id).setPlatformId((Integer) platformId));
                }
                Db.batchSave(modulePlatformList, modulePlatformList.size());
            }

            renderJson(ResultKit.success(I18nKit.get("edit_success", Constant.SYSTEM_MODULE, this)));
            return;
        }
        renderJson(ResultKit.success(I18nKit.get("edit_fail", Constant.SYSTEM_MODULE, this)));
    }

    /**
     * 启用
     *
     * @param id|模块id|Integer|必填
     * @title 启用
     */
    @Before(RequiredIdValidator.class)
    @RequiresPermissions("system:update")
    public void use() {
        Module module = Module.dao.findById(getParaToInt("id"));
        if (StrKit.notNull(module)) {
            if (module.getInt("open") == 0) {
                module.setOpen(1);
            }
            else {
                module.setOpen(0);
            }
            module.update();
            renderJson(ResultKit.success(I18nKit.get("success", Constant.SYSTEM_MODULE, this)));
            return;
        }
        renderJson(ResultKit.success(I18nKit.get("fail", Constant.SYSTEM_MODULE, this)));
    }

    /**
     * 允许或禁止编辑栏目
     *
     * @param id|模块id|Integer|必填
     * @title 允许或禁止编辑栏目
     */
    @Before(RequiredIdValidator.class)
    @RequiresPermissions("system:update")
    public void editColumn() {
        Module module = Module.dao.findById(getParaToInt("id"));
        if (StrKit.notNull(module)) {
            if (module.getEditColumn() == 0) {
                module.setEditColumn(1);
            }
            else {
                module.setEditColumn(0);
            }
            module.update();
            renderJson(ResultKit.success(I18nKit.get("success", Constant.SYSTEM_MODULE, this)));
            return;
        }
        renderJson(ResultKit.success(I18nKit.get("fail", Constant.SYSTEM_MODULE, this)));
    }
}
